using System;

namespace LannyPractiseCode
{
    public class MiGong
    {
        public void RunMiGong()
        {
            int[,] map=new int[8,7];
            //使用1表示墙 上下全部设置为1
            for(int i=0;i<7;i++)
            {
                map[0,i]=1;
                map[7,i]=1;
            }
            //左右全部设置为1
            for(int i=0;i<8;i++)
            {
                map[i,0]=1;
                map[i,6]=1;
            }

            //设置挡板
            map[3,1]=1;
            map[3,2]=1;

            //输出地图
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    System.Console.Write(map[i,j]+" ");
                }
                System.Console.WriteLine("");
            }

            SetWay(map,1,1);

            //输出新的地图
            System.Console.WriteLine("输出新的地图****");
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    System.Console.Write(map[i,j]+" ");
                }
                System.Console.WriteLine("");
            }
        }
    
        //使用递归回溯来给小球找路
        //说明
        //1. map 表示地图
        //2. i,j表示从地图的哪个位置开始出发(1,1)
        //3.如果小球能到map[6][5]位置，则说明通路找到.I
        //4.约定:当map[i][j] 为0表示，表示该点没有走过；1表示墙；3表示已经走过但是走不通
        //5.走迷宫的时候，需要确定一个策略：下->右->上->左,如果该点走不通，在回溯。
        public bool SetWay(int[,] map,int i,int j)
        {
            if(map[6,5]==2)
                return true;
            else
            {
                if(map[i,j]==0)//如果当前节点没有走过
                {
                    //策略：下->右->上->左
                    map[i,j]=2;//先假定是可以走通的
                    if(SetWay(map,i+1,j)) //向下走 
                        return true;
                    else if(SetWay(map,i,j+1)) //向右走
                        return true;
                    else if(SetWay(map,i-1,j)) //向上走
                        return true;
                    else if(SetWay(map,i,j-1))
                        return true;
                    else
                    {
                        map[i,j]=3;//说明该节点走不通，是死路
                        return false;
                    }
                }
                else //如果map[i,j]!=0,可能是1，2，3
                    return false;
            }
        }
    }
}